"""
什么是方法/函数？
自定义封装方法与函数，用于其他人或自己调用

方法特点？
不调用，不会执行的
调用方法要加上()才可以
比如说：print()、input()、eval()

有哪些方法的类型？
1、内置库/内置方法（python自带的，不需要安装就可以使用）：random、json、eval、print、input
2、三方库（需要通过pip进行安装才可以使用的）：pandas(数据清洗、数据分析)、selenium(UI自动化测试用)、requests(接口自动化)...
3、自定义方法（今天和明天要学习的）：自己封装一个方法，自己调用或给其他人使用
"""
# 需求： 五岁以下，三岁以上的小孩子，唱一遍儿歌
#       三岁以下的孩子唱两遍儿歌
"""
age = int(input("请输入你的年龄："))
if age < 3:
    for i in range(2):
        print("小兔子乖乖")
        print("把门儿开开")
        print("快点开开")
        print("我要进来")
elif age >=3 and age <=5:
    print("小兔子乖乖")
    print("把门儿开开")
    print("快点开开")
    print("我要进来")
"""


# 函数定义，都是def开头的，def也是函数定义的关键字
def tuzi():
    print("小兔子乖乖")
    print("把门儿开开")
    print("快点开开")
    print("我要进来")


"""
def：定义函数的关键字
tuzi()： 自己定义的函数名称，只要遵循变量命名规则就可以（不能以数字开头命名、不能起关键字：while、for...）
【下面都叫做：函数体】
print("小兔子乖乖")
print("把门儿开开")
print("快点开开")
print("我要进来")
"""
# 调用函数执行
# tuzi()
# 按照上面的需求，我们再用函数处理下：
"""
age = int(input("请输入你的年龄："))
if age <3:
    for i in range(2):
        tuzi()
elif age >=3 and age <=5:
    tuzi()
"""


# ============================没有形参、没有返回值==========================
def stuinfo():
    print("我们是QC5正在学习中...")


# 调用函数
# stuinfo()
# ============================有形参，没有返回值===========================
def stuinfo2(cls: str):
    """
    :param cls: 需要传递的参数，我们都叫做形式参数，简称：形参（str：提示调用者，你需要传递的类型是字符串）
    :return:
    """
    if cls == 'qc4':
        print("已经全部就业")
    elif cls == 'qc5':
        print("正在学习自动化测试")
    elif cls == 'qc6':
        print("正在学习测试基础")


# 调用这个方法
# stuinfo2('qc5')
"""
形参：形式参数，函数定义的时候，需要调用者/使用者传递的参数内容
实参：实际参数，调用函数时，实际传入的参数内容

套用上面的案例：
形参----->cls
实参----->qc5
"""


# 【1】 不定长参数 *args
def info(name: int, *args):
    print(name)
    print(args)


"""
*args：
1、不定长参数，理论上来说，可以无限传参，没有限制。
2、*args参数的返回值是一个元组类型
3、*args参数名字也是可以改变的，只要普通变量前面加上*就是不定长参数
4、如果函数中，有普通的形参，那么*args必须要放到最后面才可以
"""


# info(11,22,[11,22],{'name':'张三'},(11,22,33),{55,66,7},1.1)
# 打印结果：11
#        (22,[11,22],{'name':'张三'},(11,22,33),{55,66,7},1.1)

# 【2】 不定长关键字参数 **kwargs
def info2(**kwargs):
    print(kwargs)


"""
**kwargs:
1、不定长关键字参数，需要传入字典形态参数才可以，理论上来说，额可以无限传参，没有限制
2、**kwargs参数的返回值是---dict字典类型
3、**kwargs参数名字可以给改变的，只要普通变量前面加上**就是不定长关键字参数
4、如果函数中，有普通的形参、不定长参数，**kwargs必须要放到最后面才可以
"""


# info2(name='张三',age=19,address='辽宁沈阳')
# 打印结果：{"name":"张三","age":19,"address":"辽宁沈阳"}

# 【3】 默认参数
def stu3(name: str, age: int, address: str = '沈阳'):
    print(f"大家好，我叫做：{name}，今年：{age}岁，来自：{address}")


# 这个参数不传递，就是默认的值。上面的address如果没有传递，默认就是沈阳
# stu3('张三',21)


# 【4】有默认参数、普通参数、不定长参数、不定长关键字参数
def stu4(name: str, age: int, cls='qc4', *args, **kwargs):
    print(name)
    print(age)
    print(cls)
    print(args)
    print(kwargs)

# 调用方法
# stu4('张三', 19, 'qc4', 11, 22, 33, 44, [11, 2, 333, 44], {"name": "suki"}, names='王五', ages=21)
"""
张三
19
qc4
(11,22,33,44,[11,2,333,44],{"name":"suki"})
{'names':'王五','ages':21}
"""
# 【5】 指示参数传递
def stu5(name:str,age:int,sex:str,cls:str):
    print(f"大家好，我叫做：{name}，今年：{age}岁，性别位：{sex}，在：{cls}学习中！")

# 调用函数
# stu5(cls='qc5',sex='女',age=20,name='张三')
# stu5('张三',20,'男','qc5')

# ============================有形参，有返回值===========================
def stu6(cls:str)->str:
    if cls == 'qc4':
        return "学员全部就业"
    elif cls == 'qc5':
        return "正在学习自动化测试"
    elif cls == 'qc6':
        return "正在学习测试基础"
    elif cls == 'qc7':
        pass        # 执行这里的时候，就是None，表示没有任何的返回值
"""
stu6：函数名字
cls：形式参数，类型是str对象
->str：返回类型是字符串类型的
return：返回值（一个函数只能有一个return），代码执行到此，后续不会再执行了，会将结果返回
"""
# r = stu6('qc7')
# print(r)

def stu7(cls:str,name:str)->str:
    if cls =='qc4':
        return f"{name} 已经就业！"
        print(f"{name}已经上班一个月啦！")       # 这个是无效的，代码不会报错，但是也不会执行。原因：它放到了return后面了

# 调用函数
# print(stu7('qc4', '张三'))

# ==========================全局变量和局部变量============================
name = '李四'     # 全局变量
def stu8():
    name = '张三'     # 局部变量
    print(name)
# 调用函数
# stu8()
"""
name会是李四？ 还是张三？

答：张三
为什么？
因为在函数外面定义的变量，叫做：全局变量
在函数里面定义的变量，叫做：局部变量

在调用函数的时候，里外都有重名变量的：局部变量 》 全局变量
"""
a = 10  # 全局变量
def num():
    a = 6   # 局部变量
# num()
# print(a)        # 局部变量是改变不了全局的
#  现在，这个a就是10

# 我就是想在函数里面，修改全局变量的值
b = 12
def num2():
    global b        # global：在函数内，修改全局变量
    b = 22
# num2()
# print(b)

# ====================================在一个函数中调用另外一个函数=============================
def run():
    print("正在热身...")
def end():
    print("游戏结束")
def playfootbool():
    run()
    print("踢足球")
    end()
# 调用playfootbool
playfootbool()
"""
正在热身...
踢足球
游戏结束
"""



























